package com.sxj.corejava.code05_反射;

import java.lang.reflect.Field;
import java.util.Arrays;

/**
 * @author 石小俊
 * @date 2023年12月2023/12/21日 18:03
 */
public class Test04_操作属性 {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Class c = User.class;
        System.out.println(c);

        // 1.获取当前类以及其父类中所有public修饰的属性
        Field[] fields = c.getFields();
        System.out.println(Arrays.toString(fields));

        // 2.获取当前类中所有属性,不区分修饰符,无法访问父类
        fields = c.getDeclaredFields();
        System.out.println(Arrays.toString(fields));

        // 3.获取当前类以及其父类中指定的有public修饰的属性
        // 参数表示需要访问的属性是谁
        // 当前类中的
        Field usernameField = c.getField("username");
        System.out.println(usernameField);

        // 如果不是public修饰的属性,则报错
        // Field passwordField = c.getField("password");
        // System.out.println(passwordField);

        // 父类中的
        Field phoneField = c.getField("phone");
        System.out.println(phoneField);

        // 4.获取当前类中指定属性,不区分修饰符
        usernameField = c.getDeclaredField("username");
        System.out.println(usernameField);

        Field passwordField = c.getDeclaredField("password");
        System.out.println(passwordField);

        // Field方法
        User user = new User();
        // 为指定对象user中的指定属性usernameField赋予指定的值admin
        // 此时相当于调用了对应对象的set方法
        // 但是对象中可以没有set方法
        usernameField.set(user, "admin");
        System.out.println(user);

        // 如果属性是由private所修饰的,无法直接赋值
        // passwordField.set(user,"123456");

        // 同样可以取消权限控制检查,即:破坏其封装原则
        passwordField.setAccessible(true);
        passwordField.set(user, "123456");
        System.out.println(user);

        System.out.println("username:" + usernameField.get(user));
        System.out.println("password:" + passwordField.get(user));

    }
}
